﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;
using Ferreteria.Forms;
using Ferreteria.Forms.GestionPedidos;

namespace Ferreteria.Forms
{
    public partial class frmArticuloVentaBuscar : Form
    {
        DisancoEntities context;
        Articulos articuloSeleccionado;

        int cantidad;
        decimal precioOferta;
        decimal precioOfertaFinal;
        decimal precioBonificado;
        decimal precioTotal;
        decimal ofertaBonificacion = 0m;

        public static bool conOferta;
        

        Font fuenteNormal = new Font("Calibri", 11, FontStyle.Regular);
        Font fuenteNegrita = new Font("Calibri", 11, FontStyle.Bold);

        //Tipos de busqueda
        const string nombre_y_categoria = "Nombre o Categoria";
        const string nombre = "Nombre del Articulo";
        const string categoria = "Categoría";
        const string rubro = "Rubro";
        const string codigo = "Código";

        DataGridView tablaArticulos;

        public frmArticuloVentaBuscar(DataGridView tabla)
        {
            InitializeComponent();
            //context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            tablaArticulos = tabla;

            cmbCategorias.Items.Add(nombre_y_categoria);
            cmbCategorias.Items.Add(nombre);
            cmbCategorias.Items.Add(categoria);
            cmbCategorias.Items.Add(rubro);
            cmbCategorias.Items.Add(codigo);

            cmbCategorias.SelectedIndex = 0;

            dgvArticulos.AutoGenerateColumns = false;
            dgvOfertas.AutoGenerateColumns = false;

            cargarArticulos();
        }

        public decimal PrecioTotal
        {
            get { return precioTotal; }
        }

        public decimal PrecioUnitario
        {
            get
            {
                if (conOferta)
                    return precioOferta;
                else
                    return precioBonificado;
            }
        }

        public decimal Bonificacion
        {
            get { return ofertaBonificacion; }
        }

        public int Cantidad
        {
            get { return cantidad; }
        }

        public int Articulo
        {
            get { return articuloSeleccionado.art_id; }
        }

        private void cargarArticulos()
        {
            try
            {
                context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

                dgvArticulos.DataSource = context.VistaArticulos.Top("50");
             
                dgvOfertas.DataSource = null;
                dgvArticulos.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                dgvArticulos.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

                numCantidad.Minimum = 0;
                numCantidad.Value = 0;
                numCantidad.Enabled = false;

                lblPrecioBonificado.Font = fuenteNormal;
                lblPrecioOfertaFinal.Font = fuenteNormal;
                lblPrecioTotal.Font = fuenteNormal;

                txbPrecioBonificado.Text = "";
                txbPrecioOferta.Text = "";
                txbPrecioOfertaFinal.Text = "";
                txbPrecioTotal.Text = "";

                btnAgregar.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void cargarArticuloSeleccionado()
        {
            int art_id = (int)dgvArticulos.CurrentRow.Cells["art_id"].Value;
            articuloSeleccionado = context.Articulos.FirstOrDefault(a => a.art_id == art_id);

            if (articuloSeleccionado != null)
            {
                //Blanqueo la lista
                for (int i = 0; i < dgvArticulos.Rows.Count; i++)
                {
                    dgvArticulos.Rows[i].DefaultCellStyle.BackColor = SystemColors.Window;
                    dgvArticulos.Rows[i].DefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
                }
                //Resalto el articulo seleccionado
                dgvArticulos.CurrentRow.DefaultCellStyle.BackColor = Color.Green;
                dgvArticulos.CurrentRow.DefaultCellStyle.SelectionBackColor = Color.DarkGreen;

                numCantidad.Maximum = articuloSeleccionado.art_stock;

                if (articuloSeleccionado.art_stock > 0)
                {
                    numCantidad.Minimum = 1;
                    numCantidad.Value = 1;                    
                    numCantidad.Enabled = true;

                    btnAgregar.Enabled = true;
                }
                else
                {
                    numCantidad.Minimum = 0;
                    numCantidad.Value = 0;
                    numCantidad.Enabled = false;

                    btnAgregar.Enabled = false;
                }

                precioBonificado = Convert.ToDecimal(articuloSeleccionado.art_precio_bonificado);
                precioBonificado = Math.Round(precioBonificado, 2);

                txbPrecioBonificado.Text = precioBonificado.ToString();

                cargarOfertas();
                calcularPrecioFinal();

                numCantidad.Focus();
                numCantidad.Select(0, numCantidad.Value.ToString().Count());
            }
        }

        private void cargarOfertas()
        {
            if (articuloSeleccionado.art_precio_oferta != 0)
            {
                dgvOfertas.DataSource = articuloSeleccionado.OfertasxArticulo;

                precioOferta = articuloSeleccionado.art_precio_oferta;
                conOferta = true;

                txbPrecioOferta.Text = precioOferta.ToString();

                lblPrecioOfertaFinal.Font = fuenteNegrita;
                lblPrecioBonificado.Font = fuenteNormal;
            }
            else
            {
                dgvOfertas.DataSource = null;

                precioOferta = 0;
                precioOfertaFinal = 0;
                conOferta = false;

                txbPrecioOferta.Text = "";
                txbPrecioOfertaFinal.Text = "";

                lblPrecioBonificado.Font = fuenteNegrita;
                lblPrecioOfertaFinal.Font = fuenteNormal;
            }
        }

        void calcularPrecioFinal()
        {
            cantidad = Convert.ToInt32(numCantidad.Value);
            frmAgregarEditarPedido.IdOfertaAplicada = 0;

            if (conOferta)
            {
                //Busco todas las ofertas que puedo aplicar
                var query = (from of in articuloSeleccionado.OfertasxArticulo
                            where of.oferta_cantidad <= cantidad
                            select of).OrderByDescending(t => t.oferta_cantidad);

                //La primera de la lista deberia ser la mejor
                OfertasxArticulo mejorOferta = query.FirstOrDefault();

                //Si no hay ofertas q se apliquen, solo tomo el precio oferta tal cual esta
                if (mejorOferta != null)
                {
                    ofertaBonificacion = mejorOferta.oferta_descuento;

                    precioOfertaFinal = Math.Round(precioOferta / (1 + ofertaBonificacion), 2);

                    frmAgregarEditarPedido.IdOfertaAplicada = mejorOferta.oferta_id;

                    foreach (DataGridViewRow fila in dgvOfertas.Rows)
                    {
                        if ((int)fila.Cells["oferta_id"].Value == mejorOferta.oferta_id)
                        {
                            fila.DefaultCellStyle.BackColor = Color.Green;
                            fila.DefaultCellStyle.SelectionBackColor = Color.Green;
                        }
                        else
                        {
                            fila.DefaultCellStyle.BackColor = SystemColors.Window;
                            fila.DefaultCellStyle.SelectionBackColor = SystemColors.Window;
                        }
                    }
                }
                else
                {
                    precioOfertaFinal = precioOferta;
                    ofertaBonificacion = 0;
                }

                txbPrecioOfertaFinal.Text = precioOfertaFinal.ToString();
                
                precioTotal = precioOfertaFinal * cantidad;
            }
            else
            {
                precioTotal = precioBonificado * cantidad;
            }

            txbPrecioTotal.Text = precioTotal.ToString();
            lblPrecioTotal.Font = fuenteNegrita;
        }

        void buscar()
        {
            if (txbBuscar.Text == "")
            {
                cargarArticulos();
            }
            else
            {
                if (txbBuscar.Text.Length > 2)
                {
                    try
                    {
                        if (articuloSeleccionado != null)
                            cargarArticulos();

                        context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

                        IEnumerable<VistaArticulos> articulosQuery;

                        string cadena = txbBuscar.Text;
                        string tipo_busqueda = (string)cmbCategorias.SelectedItem;

                        switch (tipo_busqueda)
                        {
                            case categoria:
                                articulosQuery = from vista in context.VistaArticulos
                                                 where vista.categ_nombre.Contains(cadena)
                                                 orderby vista.art_nombre // agregue para ordenar
                                                 select vista;
                                break;
                            case rubro:
                                articulosQuery = from vista in context.VistaArticulos
                                                 where vista.rubro_nombre.Contains(cadena)
                                                 orderby vista.art_nombre // agregue para ordenar
                                                 select vista;
                                break;
                            case nombre:
                                articulosQuery = from vista in context.VistaArticulos
                                                 where vista.art_nombre.Contains(cadena)
                                                 orderby vista.art_nombre // agregue para ordenar
                                                 select vista;
                                break;
                            case codigo:
                                articulosQuery = from vista in context.VistaArticulos
                                                 where vista.art_codigo.Contains(cadena)
                                                 orderby vista.art_nombre // agregue para ordenar
                                                 select vista;
                                break;
                            default:
                                articulosQuery = from vista in context.VistaArticulos
                                                 where vista.art_nombre.Contains(cadena) || vista.categ_nombre.Contains(cadena)
                                                 orderby vista.art_nombre // agregue para ordenar
                                                 select vista;
                                break;
                        }
                     
                        dgvArticulos.DataSource = articulosQuery;
                       
                       
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
            //try
            //{
            //    if (articuloSeleccionado != null)
            //        btnLimpiar.PerformClick();

            //    context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            //    IEnumerable<VistaArticulos> query;
            //    string cadena = txbBuscar.Text;
            //    string tipo_busqueda = (string)cmbCategorias.SelectedItem;

            //    switch (tipo_busqueda)
            //    {
            //        case "Nombre del proveedor":
            //            {
            //                query = (from vista in context.VistaArticulos
            //                         join prov_art in context.ProveedoresxArticulos on vista.art_id equals prov_art.art_id
            //                         where prov_art.Proveedores.prov_nombre.Contains(cadena)
            //                         select vista).OrderBy(q => q.art_nombre);

            //                break;
            //            }
            //        case "Categoria":
            //            {
            //                query = (from vista in context.VistaArticulos
            //                         where vista.categ_nombre.Contains(cadena)
            //                         select vista).OrderBy(q => q.art_nombre);
            //                break;
            //            }
            //        case "Rubro":
            //            {
            //                query = (from vista in context.VistaArticulos
            //                         join art in context.Articulos on vista.art_id equals art.art_id
            //                         where art.Categorias.Rubros.rubro_nombre.Contains(cadena)
            //                         select vista).OrderBy(q => q.art_nombre);
            //                break;
            //            }
            //        default:
            //            {
            //                query = (from vista in context.VistaArticulos
            //                         where vista.art_nombre.Contains(txbBuscar.Text)
            //                         select vista).OrderBy(q => q.art_nombre);
            //                break;
            //            }
            //    }

            //    dgvArticulos.DataSource = query;
            //}
            //catch (Exception ex)
            //{
            //    MessageBox.Show(ex.Message);
            //}
        }

        //
        //Eventos
        //
        private void btnBuscar_Click(object sender, EventArgs e)
        {

        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
            
        }
        
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            if (tablaArticulos.Rows.Count == Constantes.maximoLineasFactura)
            {
                MessageBox.Show("No se pueden agregar mas articulos a este Presupuesto", "Información", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                if (verificarArticulo(articuloSeleccionado.art_id))
                {
                    int i = tablaArticulos.Rows.Add();

                    tablaArticulos.Rows[i].Cells["art_id"].Value = articuloSeleccionado.art_id;
                    tablaArticulos.Rows[i].Cells["art_codigo"].Value = articuloSeleccionado.art_codigo;
                    tablaArticulos.Rows[i].Cells["art_nombre"].Value = articuloSeleccionado.art_nombre;
                    tablaArticulos.Rows[i].Cells["cantidad"].Value = cantidad;
                    if (FrmNotaCredito.notacred == true & FrmNotaCredito.notacredAd == false)//si es nota de credito oficial cargo los precios sin iva
                    {
                        decimal sacoiva = Math.Round((this.PrecioUnitario / (1 + Clases.Constantes.IVA)), 2);

                        decimal preciosinivainc = Math.Round((sacoiva * (1 + FrmNotaCredito.incremento)), 2);////si llevo un recargo manual cuando vendio
                        tablaArticulos.Rows[i].Cells["precio_unitario"].Value = preciosinivainc;
                        tablaArticulos.Rows[i].Cells["oferta_descuento"].Value = ofertaBonificacion;
                        tablaArticulos.Rows[i].Cells["precio_bonificado"].Value = Funcion.PrecioBonificado(preciosinivainc, ofertaBonificacion);
                        tablaArticulos.Rows[i].Cells["precio_final"].Value = (Funcion.PrecioBonificado(preciosinivainc, ofertaBonificacion)) * cantidad;
                    }
                    else
                     if (FrmNotaCredito.notacred == true & FrmNotaCredito.notacredAd == true) //si es notadecred adicional
                        {
                            decimal preciounitinc = Math.Round((PrecioUnitario * (1 + FrmNotaCredito.incremento)), 2);
                            tablaArticulos.Rows[i].Cells["precio_unitario"].Value = preciounitinc;
                            tablaArticulos.Rows[i].Cells["oferta_descuento"].Value = ofertaBonificacion;
                            tablaArticulos.Rows[i].Cells["precio_bonificado"].Value = Funcion.PrecioBonificado(preciounitinc, ofertaBonificacion);
                            tablaArticulos.Rows[i].Cells["precio_final"].Value = (Funcion.PrecioBonificado(preciounitinc, ofertaBonificacion)) * cantidad;
                        }
                        else
                        { //para los presupuestos
                            decimal preciounit = this.PrecioUnitario;
                            tablaArticulos.Rows[i].Cells["precio_unitario"].Value = preciounit;
                            tablaArticulos.Rows[i].Cells["oferta_descuento"].Value = ofertaBonificacion;
                            tablaArticulos.Rows[i].Cells["precio_bonificado"].Value = Funcion.PrecioBonificado(preciounit, ofertaBonificacion);
                            tablaArticulos.Rows[i].Cells["precio_final"].Value = (Funcion.PrecioBonificado(preciounit, ofertaBonificacion)) * cantidad;
                        }
                    
                    if (FrmNotaCredito.notacred == true | FrmNotaCredito.notacredAd == true) //si es nota de credito
                       ((FrmNotaCredito)this.Owner).calcularTotales();
                    else
                       ((frmAgregarEditarPedido)this.Owner).calcularTotales();
                      
                    cargarArticulos();
                    txbBuscar.Text = "";
                    txbBuscar.Focus();
                    if (tablaArticulos.Rows.Count == Constantes.maximoLineasFactura)
                    {
                        MessageBox.Show("Ultimo Articulo agregado, No se pueden agregar mas articulos a este Presupuesto", "Información", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        this.Close();
                    }


                }
                else
                {
                    MessageBox.Show("El articulo ya fue seleccionado", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        bool verificarArticulo(int idArticulo)
        {
            foreach (DataGridViewRow fila in tablaArticulos.Rows)
            {
                if ((int)fila.Cells["art_id"].Value == idArticulo)
                {
                    return false;
                }
            }

            return true;
        }

        private void numCantidad_ValueChanged(object sender, EventArgs e)
        {
            if (articuloSeleccionado != null)
            {
                calcularPrecioFinal();
            }
        }

        private void dgvArticulos_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            cargarArticuloSeleccionado();
        }

        private void dgvArticulos_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (dgvArticulos.CurrentRow != null)
                    cargarArticuloSeleccionado();
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            cargarArticulos();
        }

        private void frmArticuloVentaBuscar_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F4)
            {
                e.Handled = true;
                txbBuscar.Focus();
                txbBuscar.SelectAll();
            }

            if (e.KeyCode == Keys.F5)
            {
                e.Handled = true;
                cargarArticulos();
            }

            if (e.KeyCode == Keys.PageUp)
            {
                e.Handled = true;
                
                if (cmbCategorias.SelectedIndex == cmbCategorias.Items.Count - 1)
                    cmbCategorias.SelectedIndex = 0;
                else
                    cmbCategorias.SelectedIndex += 1;
            }

            if (e.KeyCode == Keys.PageDown)
            {
                e.Handled = true;

                if (cmbCategorias.SelectedIndex == 0)
                    cmbCategorias.SelectedIndex = cmbCategorias.Items.Count - 1;
                else
                    cmbCategorias.SelectedIndex -= 1;
            }
        }

        private void frmArticuloVentaBuscar_Load(object sender, EventArgs e)
        {
            txbBuscar.Select();
        }

        private void txbBuscar_TextChanged(object sender, EventArgs e)
        {
            buscar();
        }

        private void numCantidad_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnAgregar.Focus();
            }
        }

        private void txbBuscar_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (dgvArticulos.CurrentRow != null)
                    cargarArticuloSeleccionado();
            }
        }

        private void numCantidad_Enter(object sender, EventArgs e)
        {
            cmbCategorias.SelectAll();
        }

        private void numCantidad_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (articuloSeleccionado != null)
            {
                calcularPrecioFinal();
            }
        }
    }
}
